package org.Yiran.timetale_re.item.material;

import net.minecraft.world.item.Item;
import net.minecraft.world.item.crafting.Ingredient;
import org.Yiran.timetale_re.item.MaterialRegister;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 模组材料定义类
 * <p>
 * 该类定义了模组中使用的所有材料及其属性，包括：
 * 1. 各种金属材料（钢、银、铝、钛等）
 * 2. 合金材料（钛铝合金、铝铜合金等）
 * 3. 工具材料属性定义
 * 4. 材料注册和获取方法
 * </p>
 */
public class ModMaterials {
    
    // ============================== 实例变量 ==============================
    
    // 存储材料名称到注册物品的映射
    private static final Map<String, MaterialRegister.MaterialDefinition> MATERIAL_MAP = new HashMap<>();

    // ============================== 材料定义 ==============================
    
    // 钢材料定义
    public static final MaterialRegister.MaterialDefinition STEEL_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "steel",
                    // 基础注册列表
                    Arrays.asList(
                            MaterialRegister.MaterialType.INGOT,
                            MaterialRegister.MaterialType.NUGGET,
                            MaterialRegister.MaterialType.BLOCK,
                            MaterialRegister.MaterialType.DUST
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    false,
                    // 矿物注册列表
                    List.of(),
                    // 挖掘等级
                    2,
                    // 最小经验值
                    0,
                    // 最大经验值
                    0,
                    // 是否有烧制配方
                    false,
                    // 烧制经验
                    0.7f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性
                    5.0F,  // 块硬度
                    6.0F,  // 块爆炸抗性
                    // 矿石硬度（虽然钢没有矿石，但仍然需要设置默认值）
                    3.0F,  // 矿石硬度
                    4.5F,  // 深板岩矿石硬度
                    3.0F   // 矿石爆炸抗性
            );

    // 银材料定义
    public static final MaterialRegister.MaterialDefinition SILVER_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "silver",
                    // 基础注册列表
                    Arrays.asList(
                            MaterialRegister.MaterialType.INGOT,
                            MaterialRegister.MaterialType.NUGGET,
                            MaterialRegister.MaterialType.BLOCK,
                            MaterialRegister.MaterialType.DUST,
                            MaterialRegister.MaterialType.RAW_BLOCK
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    true,
                    // 矿物注册列表
                    Arrays.asList(
                            MaterialRegister.OreType.ORE,
                            MaterialRegister.OreType.DEEPSLATE_ORE
                    ),
                    // 挖掘等级
                    2,
                    // 最小经验值
                    2,
                    // 最大经验值
                    5,
                    // 是否有烧制配方
                    true,
                    // 烧制经验
                    1.0f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性
                    5.0F,  // 块硬度
                    6.0F,  // 块爆炸抗性
                    // 矿石硬度和爆炸抗性
                    3.0F,  // 矿石硬度
                    4.5F,  // 深板岩矿石硬度
                    3.0F,  // 矿石爆炸抗性
                    // 矿石生成参数
                    4,     // 普通矿脉最小大小
                    8,     // 普通矿脉最大大小
                    1,     // 深层矿脉最小大小
                    4,     // 深层矿脉最大大小
                    8,     // 矿脉数量
                    -64,   // 最小生成高度
                    32     // 最大生成高度
            );

    // 铝材料定义
    public static final MaterialRegister.MaterialDefinition ALUMINUM_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "aluminum",
                    // 基础注册列表
                    Arrays.asList(
                            MaterialRegister.MaterialType.INGOT,
                            MaterialRegister.MaterialType.NUGGET,
                            MaterialRegister.MaterialType.BLOCK,
                            MaterialRegister.MaterialType.DUST,
                            MaterialRegister.MaterialType.RAW_BLOCK
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    true,
                    // 矿物注册列表
                    Arrays.asList(
                            MaterialRegister.OreType.ORE,
                            MaterialRegister.OreType.DEEPSLATE_ORE
                    ),
                    // 挖掘等级
                    2,
                    // 最小经验值
                    1,
                    // 最大经验值
                    3,
                    // 是否有烧制配方
                    true,
                    // 烧制经验
                    0.8f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性
                    4.0F,  // 块硬度
                    5.0F,  // 块爆炸抗性
                    // 矿石硬度和爆炸抗性
                    3.0F,  // 矿石硬度
                    4.0F,  // 深板岩矿石硬度
                    3.0F,  // 矿石爆炸抗性
                    // 矿石生成参数
                    5,     // 普通矿脉最小大小
                    9,     // 普通矿脉最大大小
                    2,     // 深层矿脉最小大小
                    6,     // 深层矿脉最大大小
                    10,    // 矿脉数量
                    -40,   // 最小生成高度
                    60     // 最大生成高度
            );

    // 钛材料定义
    public static final MaterialRegister.MaterialDefinition TITANIUM_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "titanium",
                    // 基础注册列表
                    Arrays.asList(
                            MaterialRegister.MaterialType.INGOT,
                            MaterialRegister.MaterialType.NUGGET,
                            MaterialRegister.MaterialType.BLOCK,
                            MaterialRegister.MaterialType.DUST,
                            MaterialRegister.MaterialType.RAW_BLOCK
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    true,
                    // 矿物注册列表
                    Arrays.asList(
                            MaterialRegister.OreType.ORE,
                            MaterialRegister.OreType.DEEPSLATE_ORE
                    ),
                    // 挖掘等级
                    3,
                    // 最小经验值
                    3,
                    // 最大经验值
                    7,
                    // 是否有烧制配方
                    true,
                    // 烧制经验
                    1.2f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性
                    6.0F,  // 块硬度
                    7.0F,  // 块爆炸抗性
                    // 矿石硬度和爆炸抗性
                    4.0F,  // 矿石硬度
                    5.0F,  // 深板岩矿石硬度
                    4.0F,  // 矿石爆炸抗性
                    // 矿石生成参数
                    3,     // 普通矿脉最小大小
                    6,     // 普通矿脉最大大小
                    1,     // 深层矿脉最小大小
                    3,     // 深层矿脉最大大小
                    6,     // 矿脉数量
                    -60,   // 最小生成高度
                    20     // 最大生成高度
            );

    // 铜材料定义
    public static final MaterialRegister.MaterialDefinition COPPER_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "copper",
                    // 基础注册列表 - 只注册粉末
                    List.of(
                            MaterialRegister.MaterialType.DUST
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    false,
                    // 矿物注册列表
                    List.of(),
                    // 挖掘等级
                    1,
                    // 最小经验值
                    0,
                    // 最大经验值
                    0,
                    // 是否有烧制配方
                    false,
                    // 烧制经验
                    0.0f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性（虽然不需要块，但仍需设置默认值）
                    3.0F,  // 块硬度
                    4.0F,  // 块爆炸抗性
                    // 矿石硬度（虽然不需要矿石，但仍需设置默认值）
                    3.0F,  // 矿石硬度
                    4.0F,  // 深板岩矿石硬度
                    3.0F   // 矿石爆炸抗性
            );

    // 钛铝合金定义
    public static final MaterialRegister.MaterialDefinition TITANIUM_ALUMINUM_ALLOY_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "titanium_aluminum_alloy",
                    // 基础注册列表
                    Arrays.asList(
                            MaterialRegister.MaterialType.INGOT,
                            MaterialRegister.MaterialType.NUGGET,
                            MaterialRegister.MaterialType.BLOCK,
                            MaterialRegister.MaterialType.DUST
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    false,
                    // 矿物注册列表
                    List.of(),
                    // 挖掘等级
                    3,
                    // 最小经验值
                    0,
                    // 最大经验值
                    0,
                    // 是否有烧制配方
                    false,
                    // 烧制经验
                    0.0f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性
                    6.5F,  // 块硬度
                    7.5F,  // 块爆炸抗性
                    // 矿石硬度（虽然没有矿石，但仍然需要设置默认值）
                    3.0F,  // 矿石硬度
                    4.0F,  // 深板岩矿石硬度
                    3.0F   // 矿石爆炸抗性
            );

    // 铝铜合金定义
    public static final MaterialRegister.MaterialDefinition ALUMINUM_COPPER_ALLOY_MATERIAL =
            MaterialRegister.registerMaterial(
                    // 注册名
                    "aluminum_copper_alloy",
                    // 基础注册列表
                    Arrays.asList(
                            MaterialRegister.MaterialType.INGOT,
                            MaterialRegister.MaterialType.NUGGET,
                            MaterialRegister.MaterialType.BLOCK,
                            MaterialRegister.MaterialType.DUST
                    ),
                    new Item.Properties(),
                    // 有无矿物
                    false,
                    // 矿物注册列表
                    List.of(),
                    // 挖掘等级
                    2,
                    // 最小经验值
                    0,
                    // 最大经验值
                    0,
                    // 是否有烧制配方
                    false,
                    // 烧制经验
                    0.0f,
                    // 烧制时间
                    200,
                    // 材料块硬度和爆炸抗性
                    5.0F,  // 块硬度
                    6.0F,  // 块爆炸抗性
                    // 矿石硬度（虽然没有矿石，但仍然需要设置默认值）
                    3.0F,  // 矿石硬度
                    4.0F,  // 深板岩矿石硬度
                    3.0F   // 矿石爆炸抗性
            );

    // ============================== 工具材料属性定义 ==============================
    
    // 钢工具材料属性
    public static final ToolMaterial STEEL_TOOL_MATERIAL =
        new ToolMaterial(
                // 挖掘等级
                2,
                // 耐久度
                500,
                // 挖掘速度
                7.0F,
                // 攻击伤害
                2.5F,
                // 附魔值
                14,
            () -> {
                if (STEEL_MATERIAL.getIngot() != null) {
                    return Ingredient.of(STEEL_MATERIAL.getIngot().get());
                }
                return Ingredient.of(net.minecraft.world.item.Items.IRON_INGOT);
            }
        );

    // 银工具材料属性
    public static final ToolMaterial SILVER_TOOL_MATERIAL =
            new ToolMaterial(
                    // 挖掘等级
                    2,
                    // 耐久度
                    300,
                    // 挖掘速度
                    7.5F,
                    // 攻击伤害
                    2.0F,
                    // 附魔值
                    18,
                    () -> {
                        if (SILVER_MATERIAL.getIngot() != null) {
                            return Ingredient.of(SILVER_MATERIAL.getIngot().get());
                        }
                        return Ingredient.of(net.minecraft.world.item.Items.IRON_INGOT);
                    }
            );

    // 铝工具材料属性
    public static final ToolMaterial ALUMINUM_TOOL_MATERIAL =
            new ToolMaterial(
                    // 挖掘等级
                    2,
                    // 耐久度
                    350,
                    // 挖掘速度
                    7.0F,
                    // 攻击伤害
                    2.0F,
                    // 附魔值
                    16,
                    () -> {
                        if (ALUMINUM_MATERIAL.getIngot() != null) {
                            return Ingredient.of(ALUMINUM_MATERIAL.getIngot().get());
                        }
                        return Ingredient.of(net.minecraft.world.item.Items.IRON_INGOT);
                    }
            );

    // 钛工具材料属性
    public static final ToolMaterial TITANIUM_TOOL_MATERIAL =
            new ToolMaterial(
                    // 挖掘等级
                    3,
                    // 耐久度
                    1200,
                    // 挖掘速度
                    8.0F,
                    // 攻击伤害
                    3.0F,
                    // 附魔值
                    15,
                    () -> {
                        if (TITANIUM_MATERIAL.getIngot() != null) {
                            return Ingredient.of(TITANIUM_MATERIAL.getIngot().get());
                        }
                        return Ingredient.of(net.minecraft.world.item.Items.IRON_INGOT);
                    }
            );

    // 铜工具材料属性
    public static final ToolMaterial COPPER_TOOL_MATERIAL =
            new ToolMaterial(
                    // 挖掘等级
                    1,
                    // 耐久度
                    200,
                    // 挖掘速度
                    4.0F,
                    // 攻击伤害
                    1.5F,
                    // 附魔值
                    12,
                    () -> Ingredient.of(net.minecraft.world.item.Items.COPPER_INGOT)
            );

    // 钛铝合金工具材料属性
    public static final ToolMaterial TITANIUM_ALUMINUM_ALLOY_TOOL_MATERIAL =
            new ToolMaterial(
                    // 挖掘等级
                    4,
                    // 耐久度
                    2400,
                    // 挖掘速度
                    8.5F,
                    // 攻击伤害
                    3.5F,
                    // 附魔值
                    25,
                    () -> {
                        if (TITANIUM_ALUMINUM_ALLOY_MATERIAL.getIngot() != null) {
                            return Ingredient.of(TITANIUM_ALUMINUM_ALLOY_MATERIAL.getIngot().get());
                        }
                        return Ingredient.of(net.minecraft.world.item.Items.IRON_INGOT);
                    }
            );

    // 铝铜合金工具材料属性
    public static final ToolMaterial ALUMINUM_COPPER_ALLOY_TOOL_MATERIAL =
            new ToolMaterial(
                    // 挖掘等级
                    2,
                    // 耐久度
                    400,
                    // 挖掘速度
                    7.0F,
                    // 攻击伤害
                    2.2F,
                    // 附魔值
                    15,
                    () -> {
                        if (ALUMINUM_COPPER_ALLOY_MATERIAL.getIngot() != null) {
                            return Ingredient.of(ALUMINUM_COPPER_ALLOY_MATERIAL.getIngot().get());
                        }
                        return Ingredient.of(net.minecraft.world.item.Items.IRON_INGOT);
                    }
            );

    // ============================== 静态初始化块 ==============================
    
    static {
        MATERIAL_MAP.put("steel", STEEL_MATERIAL);
        MATERIAL_MAP.put("silver", SILVER_MATERIAL);
        MATERIAL_MAP.put("aluminum", ALUMINUM_MATERIAL);
        MATERIAL_MAP.put("titanium", TITANIUM_MATERIAL);
        MATERIAL_MAP.put("copper", COPPER_MATERIAL);
        MATERIAL_MAP.put("titanium_aluminum_alloy", TITANIUM_ALUMINUM_ALLOY_MATERIAL);
        MATERIAL_MAP.put("aluminum_copper_alloy", ALUMINUM_COPPER_ALLOY_MATERIAL);
    }

    // ============================== 公共方法 ==============================
    
    /**
     * 初始化材料系统
     * 通过调用此方法确保类被加载
     */
    public static void init() {
    }

    /**
     * 根据材料名称获取材料定义
     * 
     * @param name 材料名称
     * @return 材料定义对象
     */
    public static MaterialRegister.MaterialDefinition getMaterial(String name) {
        return MATERIAL_MAP.get(name);
    }
}